Stratejinin genel yapısı iki sembol arasındaki anlık fiyat farkı belirlenen Fark değişkenine geldiğinde
AlinacakSembol'den AlinacakSembolAdedi (lot, kontrat) kadarlık alış emri gönderilir
SatilacakSembol'den SatilacakSembolAdedi (lot, kontrat) kadarlık satış emri gönderilir
1-FarkBelirlenenSeviyedeykenBirSeferSatAl
Bu seçenek seçildiğinde fiyat farkı Fark değişkenine geldiğinde
Bir seferlik AlinacakSembol'den alış SatilacakSembol'den satış emri gönderilecektir.
2-FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
Bu seçenek 1. seçeneğin devamıdır. Pozisyonlar açıldıktan sonra anlık fiyat farkı Denge değişkenine geldiğinde
Bir seferlik açılan pozisyonlar kapatılır.
3-FarkBelirlenenSeviyedeykenHerzamanSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
Bu seçenek ile 1. ve 2. seçeneklerin sıralı bir şekilde ilerlemesi sağlanır.
Anlık fiyat farkı Fark değişkenine geldiğinde pozisyon açar.
Anlık fiyat farkı Denge değişkenine geldiğinde pozisyon kapatır.
Entrümanlar arasındaki fark kullanılan OranTipi'ne göre aşağıdaki gibi hesaplanmaktadır.
OranTipi Percent (Yüzde) ise -> fark = (AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati) / AlinacakSembolSatisFiyati * 100;
OranTipi PricePoint (Puan) ise -> fark = AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati;
*** Stratejide derinlik kullanıldığında en az tek kademe derinlik lisansı gerekir.
*** Bütün semboller için uygundur.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
/*
▂ ▃ ▅ ▆ █ KRİPEX █ ▆ ▅ ▃ ▂
Stratejinin genel yapısı iki sembol arasındaki anlık fiyat farkı belirlenen Fark değişkenine geldiğinde
AlinacakSembol'den AlinacakSembolAdedi (lot, kontrat) kadarlık alış emri gönderilir
SatilacakSembol'den SatilacakSembolAdedi (lot, kontrat) kadarlık satış emri gönderilir
1-FarkBelirlenenSeviyedeykenBirSeferSatAl
Bu seçenek seçildiğinde fiyat farkı Fark değişkenine geldiğinde
Bir seferlik AlinacakSembol'den alış SatilacakSembol'den satış emri gönderilecektir.
2-FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
Bu seçenek 1. seçeneğin devamıdır. Pozisyonlar açıldıktan sonra anlık fiyat farkı Denge değişkenine geldiğinde
Bir seferlik açılan pozisyonlar kapatılır.
3-FarkBelirlenenSeviyedeykenHerzamanSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
Bu seçenek ile 1. ve 2. seçeneklerin sıralı bir şekilde ilerlemesi sağlanır.
Anlık fiyat farkı Fark değişkenine geldiğinde pozisyon açar.
Anlık fiyat farkı Denge değişkenine geldiğinde pozisyon kapatır.
Entrümanlar arasındaki fark kullanılan OranTipi'ne göre aşağıdaki gibi hesaplanmaktadır.
OranTipi Percent (Yüzde) ise -> fark = (AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati) / AlinacakSembolSatisFiyati * 100;
OranTipi PricePoint (Puan) ise -> fark = AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati;
*** Stratejide derinlik kullanıldığında en az tek kademe derinlik lisansı gerekir.
*** Bütün semboller için uygundur.
*/
namespace Matriks.Lean.Algotrader
{
public class ArbitrajStratejisiKripex : MatriksAlgo
{
[SymbolParameter("FGARAN")]
public string AlinacakSembol;
[Parameter(1)]
public decimal AlinacakSembolAdedi;
[SymbolParameter("GARAN")]
public string SatilacakSembol;
[Parameter(100)]
public decimal SatilacakSembolAdedi;
[Parameter(0.15)]
public decimal Fark;
[Parameter(0.10)]
public decimal Denge;
[Parameter(SyntheticOrderPriceType.PricePoint)]
public SyntheticOrderPriceType OranTipi;
[Parameter(fiyat.Piyasa)]
public fiyat Fiyat;
public enum fiyat
{
Piyasa, Aktif_Pasif
}
[Parameter(devamlilik.FarkBelirlenenSeviyedeykenBirSeferSatAl)]
public devamlilik Devamlilik;
public enum devamlilik
{
FarkBelirlenenSeviyedeykenBirSeferSatAl,
FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat,
FarkBelirlenenSeviyedeykenHerzamanSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
}
[Output]
public decimal AlinacakSembolAlisFiyati;
[Output]
public decimal AlinacakSembolSatisFiyati;
[Output]
public decimal SatilacakSembolAlisFiyati;
[Output]
public decimal SatilacakSembolSatisFiyati;
[Output]
public bool StratejiAktifMI = true;
public override void OnInit()
{
AddSymbol(AlinacakSembol, SymbolPeriod.Min);
AddSymbol(SatilacakSembol, SymbolPeriod.Min);
AddSymbolMarketDepth(AlinacakSembol);
AddSymbolMarketDepth(SatilacakSembol);
SendOrderSequential(false);
WorkWithPermanentSignal(false);
}
bool bayrak = true;
[Output]
public decimal fark;
[Output]
public decimal denge;
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
if (StratejiAktifMI)
{
var derinlikAlinacakSembol = GetMarketDepth(AlinacakSembol);
if (derinlikAlinacakSembol? .AskRows == null || derinlikAlinacakSembol.AskRows.Count < 1 || derinlikAlinacakSembol? .BidRows == null || derinlikAlinacakSembol.BidRows.Count < 1)
{
Debug("AlinacakSembol - Derinlik verisi bekleniyor."); return ;
}
var derinlikSatilacakSembol = GetMarketDepth(SatilacakSembol);
if (derinlikSatilacakSembol? .AskRows == null || derinlikSatilacakSembol.AskRows.Count < 1 || derinlikSatilacakSembol? .BidRows == null || derinlikSatilacakSembol.BidRows.Count < 1)
{
Debug("SatilacakSembol - Derinlik verisi bekleniyor."); return ;
}
AlinacakSembolAlisFiyati = derinlikAlinacakSembol.BidRows[0].Price;
AlinacakSembolSatisFiyati = derinlikAlinacakSembol.AskRows[0].Price;
SatilacakSembolAlisFiyati = derinlikSatilacakSembol.BidRows[0].Price;
SatilacakSembolSatisFiyati = derinlikSatilacakSembol.AskRows[0].Price;
if (OranTipi == SyntheticOrderPriceType.Percent)
{
fark = (AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati) / AlinacakSembolSatisFiyati * 100;
denge = (AlinacakSembolAlisFiyati - SatilacakSembolSatisFiyati) / AlinacakSembolAlisFiyati * 100;
}else if (OranTipi == SyntheticOrderPriceType.PricePoint)
{
fark = AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati;
denge = AlinacakSembolAlisFiyati - SatilacakSembolSatisFiyati;
}
if (fark >= Fark && bayrak)
{
Debug("Belirlenen oranda fark oluştu işleme girilecek.");
if (Fiyat == fiyat.Piyasa)
{
SendMarketOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Buy);
SendMarketOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Sell);
}else if (Fiyat == fiyat.Aktif_Pasif)
{
SendLimitOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Buy, AlinacakSembolSatisFiyati);
SendLimitOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Sell, SatilacakSembolAlisFiyati);
}
bayrak = false;
if (Devamlilik == devamlilik.FarkBelirlenenSeviyedeykenBirSeferSatAl)
{
StratejiAktifMI = false;
bayrak = true;
}
}
if (denge <= Denge && !bayrak)
{
Debug("Pozsiyonlar kapatılacak.");
if (Fiyat == fiyat.Piyasa)
{
SendMarketOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Sell);
SendMarketOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Buy);
}else if (Fiyat == fiyat.Aktif_Pasif)
{
SendLimitOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Sell, AlinacakSembolAlisFiyati);
SendLimitOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Buy, SatilacakSembolSatisFiyati);
}
bayrak = true;
if (Devamlilik == devamlilik.FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat)
{
StratejiAktifMI = false;
bayrak = false;
}
}
}
}
}
}